package com.example.tellwin.mine.act;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

import com.alipay.sdk.app.AuthTask;
import com.alipay.sdk.app.OpenAuthTask;
import com.apkfuns.logutils.LogUtils;
import com.example.tellwin.AppHelper;
import com.example.tellwin.MainApplication;
import com.example.tellwin.R;
import com.example.tellwin.base.CpBaseActivty;
import com.example.tellwin.base.DaggerRxComponent;
import com.example.tellwin.common.Common;
import com.example.tellwin.event.MineEvent;
import com.example.tellwin.mine.bean.UserInfo;
import com.example.tellwin.mine.contract.BindContract;
import com.example.tellwin.mine.presenter.BindPresenter;
import com.example.tellwin.utils.CommonUtils;
import com.example.tellwin.utils.LogUtil;
import com.example.tellwin.utils.ToastUtil;
import com.google.gson.JsonObject;

import org.greenrobot.eventbus.EventBus;

import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class BindActivity extends CpBaseActivty implements BindContract.View {

    @BindView(R.id.name_et)
    EditText nameEt;
    @BindView(R.id.account_et)
    EditText accountEt;
    @BindView(R.id.commit_btn)
    TextView commitBtn;

    int type;
    UserInfo userInfo;

    @Inject
    BindPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bind);
        ButterKnife.bind(this);
        type = getIntent().getIntExtra(Common.TYPE, 0);
        userInfo = AppHelper.getInstance().getUserInfo();
        initViews();
        initEvents();
        initDatas();
    }

    @Override
    protected void initViews() {
        DaggerRxComponent.builder()
                .baseAppComponent(MainApplication.getAppComponent())
                .build()
                .inject(this);
        mPresenter.attachView(this);

        if (type == 0) {
            setTitle(R.string.bind_bank_card);
            nameEt.setHint(R.string.input_name);
            accountEt.setHint(R.string.input_bank_card);
            accountEt.setInputType(InputType.TYPE_CLASS_NUMBER);
            if (userInfo != null) {
                nameEt.setText(CommonUtils.getStr(userInfo.getBankName()));
                accountEt.setText(CommonUtils.getStr(userInfo.getBankCard()));
            }
        } else {
            setTitle(R.string.bind_ali);
            nameEt.setHint(R.string.input_name_);
            accountEt.setHint(R.string.input_ali_account);
            accountEt.setInputType(InputType.TYPE_CLASS_TEXT);
            nameEt.setText(CommonUtils.getStr(userInfo.getZfbName()));
            accountEt.setText(CommonUtils.getStr(userInfo.getZfbAccount()));
            if (userInfo != null) {
                nameEt.setText(CommonUtils.getStr(userInfo.getZfbName()));
                accountEt.setText(CommonUtils.getStr(userInfo.getZfbAccount()));
            }
        }
    }

    @Override
    protected void initEvents() {
        accountEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                setCommitBtnEnable();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        nameEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                setCommitBtnEnable();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    @Override
    protected void initDatas() {

    }

    private void setCommitBtnEnable() {
        commitBtn.setEnabled(nameEt.getText().toString().length() > 0 && accountEt.getText().toString().length() > 0);
    }

    private final int SDK_AUTH_FLAG = 1001;

    @OnClick(R.id.commit_btn)
    public void onViewClicked() {
        JsonObject jsonObject = new JsonObject();
        if (type == 0) {
            jsonObject.addProperty("bankName", nameEt.getText().toString());
            jsonObject.addProperty("bankCard", accountEt.getText().toString());
        } else {
            jsonObject.addProperty("zfbName", nameEt.getText().toString());
            jsonObject.addProperty("zfbAccount", accountEt.getText().toString());
        }
        mPresenter.updateUserInfo(jsonObject);

    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case SDK_AUTH_FLAG:
                    Map<String, String> result = (Map<String, String>) msg.obj;
                    LogUtils.e(result);
                    String resultStatus = result.get("resultStatus");
                    if (resultStatus.equals("9000")) {
                        Map<String,String>reslutMap = new HashMap<>();
                        String resultStr = result.get("result");
                        String str[] = resultStr.split("&");
                        for (int i = 0; i < str.length; i++) {
                            String string = str[i];
                            String strings[] = string.split("=");
                            String key = strings[0];
                            String value = strings[1];
                            reslutMap.put(key ,value);
                        }
                        String resultCode = reslutMap.get("result_code");
                        if (resultCode.equals("200")) {
                            ToastUtil.show(BindActivity.this, "授权成功");
                            String auth_code = reslutMap.get("user_id");
                            LogUtils.e(auth_code);
                            mPresenter.uploadAliToken(auth_code);
                        } else if (resultCode.equals("1005")) {
                            ToastUtil.show(BindActivity.this, "账户已冻结，如有疑问，请联系支付宝技术支持。");
                        } else if (resultCode.equals("202")) {
                            ToastUtil.show(BindActivity.this, "系统异常，请稍后再试或联系支付宝技术支持。");
                        }
                    }
                    break;
            }
        }
    };

    @Override
    public void updateUserInfoResult() {
        if(type == 0) {
            ToastUtil.show(this, "绑定成功！");
        }else {
            mPresenter.getAliAuthToken();
        }
        EventBus.getDefault().post(new MineEvent());
    }

    @Override
    public void aliAuthToken(String apiname) {
        openAuthScheme(apiname);
    }

    @Override
    public void uploadAliTokenSuccess() {
        ToastUtil.show(this, "绑定成功！");
    }

    /**
     * 通用跳转授权业务的回调方法。
     * 此方法在支付宝 SDK 中为弱引用，故您的 App 需要以成员变量等方式保持对 Callback 的强引用，
     * 以免对象被回收。
     * 以局部变量保持对 Callback 的引用是不可行的。
     */
    final OpenAuthTask.Callback openAuthCallback = new OpenAuthTask.Callback() {
        @Override
        public void onResult(int resultCode, String memo, Bundle bundle) {
            if (resultCode == OpenAuthTask.OK) {
                LogUtil.e(String.format("业务成功，结果码: %s\n结果信息: %s\n结果数据: %s", resultCode, memo, bundleToString(bundle)));
            } else {
                LogUtil.e(String.format("业务失败，结果码: %s\n结果信息: %s\n结果数据: %s", resultCode, memo, bundleToString(bundle)));
            }
        }
    };

    /**
     * 通用跳转授权业务 Demo
     */
    public void openAuthScheme(String apiName) {

       /* // 传递给支付宝应用的业务参数
        final Map<String, String> bizParams = new HashMap<>();
        bizParams.put("url", "https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=2021002116607548&scope=auth_user&state=init");

        // 支付宝回跳到您的应用时使用的 Intent Scheme。请设置为不和其它应用冲突的值。
        // 请不要像 Demo 这样设置为 __alipaysdkdemo__!
        // 如果不设置，将无法使用 H5 中间页的方法(OpenAuthTask.execute() 的最后一个参数)回跳至
        // 您的应用。
        //
        // 注意！参见 AndroidManifest 中 <AlipayResultActivity> 的 android:scheme，此两处
        // 必须设置为相同的值。
        final String scheme = "__tellwin__";

        // 唤起授权业务
        final OpenAuthTask task = new OpenAuthTask(this);
        task.execute(
                scheme,  // Intent Scheme
                OpenAuthTask.BizType.AccountAuth,  // 业务类型
                bizParams,  // 业务参数
                openAuthCallback,  // 业务结果回调。注意：此回调必须被您的应用保持强引用
                true);  // 是否需要在用户未安装支付宝 App 时，使用 H5 中间页中转。建议设置为 true。*/

        // authInfo 的构造方式详见 授权请求参数 一节，或参考支付宝 SDK Demo 中的实现。
// authInfo 的生成包括签名逻辑。故生成过程请务必在服务端进行。
        final String authInfo = apiName;

// 对授权接口的调用需要异步进行。
        Runnable authRunnable = new Runnable() {
            @Override
            public void run() {
                // 构造AuthTask 对象
                AuthTask authTask = new AuthTask(BindActivity.this);
                // 调用授权接口
                // AuthTask#authV2(String info, boolean isShowLoading)，
                // 获取授权结果。
                Map<String, String> result = authTask.authV2(authInfo, true);

                // 将授权结果以 Message 的形式传递给 App 的其它部分处理。
                // 对授权结果的处理逻辑可以参考支付宝 SDK Demo 中的实现。
                Message msg = new Message();
                msg.what = SDK_AUTH_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread authThread = new Thread(authRunnable);
        authThread.start();



    }

    private static String bundleToString(Bundle bundle) {
        if (bundle == null) {
            return "null";
        }
        final StringBuilder sb = new StringBuilder();
        for (String key : bundle.keySet()) {
            sb.append(key).append("=>").append(bundle.get(key)).append("\n");
        }
        return sb.toString();
    }

}
